我們一台主機上面,通常會有好幾個程式/服務在跑,這些功能會分別監聽並佔用一個或多個 port。例如 http request 使用 80 port; https request 使用 443 port,以後我們的 MySQL 使用 3306 port。所以之前我們讓 .NET API 直接使用 80 與 443 port 其實不是很好的做法。
之前我們跑 .NET Web API 都用環境變數硬性指定我們的 API 監聽 80 與 443 port,這個同樣是為了暫時跳過防火牆與 Web Server 的設定。今天我們就先來介紹一下 GCP 的防火牆設定,然後讓 .NET Web API 用回它預設的 5000, 5001 port。
GCP 使用 “標記機制” 來對各個 VM 套用防火牆規則。我們可以預先設定防火牆規則,然後為它設定一個標籤(tag),接著 GCP 會自動幫我們搜尋帶有這個標籤的 VM,為他們套用防火牆規則。例如我們之前在建立 VM 的時候,它其實就是替我們的 VM 加上了 http-server
與 https-server
兩個標記,然後 GCP 就會為這個 VM 開通 80 與 443 port。
要建立自訂的防火牆規則,首先到 虛擬私有雲網路分類下的防火牆。點選上方的建立防火牆規則
接著,大部分的地方用預設值就好,只有幾個地方要改
1 防火牆的名字跟描述
2 賦予這個防火牆規則一個或多個標記
3 指定 IP 來源範圍設為 0.0.0.0/0 代表接收所有來源。當然,如果以後對安全性有要求,記得改成程式可以信任的 IP 來源。
4 指定 tcp 的 5000 與 5001 port。逗號(,)可以分隔多個 port;減號(-)可以指定一個範圍的 port
建立完防火牆規則之後,我們要把它套用到 VM 上。直接到 VM 列表的頁面,點選 VM 的名稱可以查看 VM 的詳細資料,然後點選上方的編輯
在網路標記的地方新增剛剛新增的防火牆標記,然後儲存。
最後我們需要再回到 VM 上,把 CentOS的防火牆也開通
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd –reload
sudo yum install firewalld
最後一個步驟,我們把之前「借用」的 80 與 443 改回 .NET 預設的 5000, 5001。先用 vim 打開 service unit 檔案sudo vi /etc/systemd/system/ironman_api.service
然後把設定 port 的環境變數改成Environment=ASPNETCORE_URLS=http://0.0.0.0:5000;https://0.0.0.0:5001
接著嘗試重啟服務會發現,Linux 跟我們警告 service 被改過了。必須執行這行指令重新載入 service sudo systemctl daemon-reload
Reload 完就可以順利重啟 service,用 sudo systemctl status ironman_api.service
指令可以看到我們的 API 程式正在監聽 5000 與 5001 port。
最後再到瀏覽器輸入 https://外部IP:5001/api/User ,確定 API 正常發揮就OK了~收工!